package utwente.sem.eindopdracht;
import java.util.ArrayList;
import java.util.List;

/**
 * Een ProductType kan een onderdeel of een Product zijn. Daarmee is een ProductType een component voor
 * een Product of het is een Product zelf. Per ProductType kan opgevraagd worden wat de voorraad is.
 * 
 * @author Richard Heijblom & Mark Wienk
 *
 */
public abstract class ProductType {
	protected String name;
	
	/**
	 * @clientCardinality 1
	 * @supplierCardinality *
	 */
	protected List<Exemplaar> exemplaren;

	/**
	 * @clientCardinality 1
	 * @clientNavigability NAVIGABLE
	 * @supplierCardinality 1
	 */

	protected Ton ton;

	/**
	 * Een ProductType kan een onderdeel of een Product zijn. Daarmee is een ProductType een component voor
	 * een Product of het is een Product zelf. Per ProductType kan opgevraagd worden wat de voorraad is.
	 */
	protected ProductType() {
		exemplaren = new ArrayList<Exemplaar>();
		Ton ton = new Ton(Controller.getController().getTonnenLijst().size() + 1);
		ton.setProductType(this);
	}
	
	/**
	 * Verkrijg de naam van het ProductType.
	 * @return de naam
	 */
	public String getName() {
		return this.name;
	}
	
	/**
	 * Stel een naam voor een Product in.
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Geeft de voorraad van het ProductType weer.
	 * @return ProductType voorraad
	 */
	public int getAantal() {
		return exemplaren.size();	
	}
	
	/**
	 * Voeg een nieuwe exemplaar toe aan het ProductType (verhoog de voorraad).
	 * @param exemplaar het nieuwe Exemplaar
	 */
	public void addExemplaar(Exemplaar exemplaar) {
		exemplaren.add(exemplaar);
	}
	
	/**
	 * Verwijder een exemplaar van het ProductType (verlaag de voorraad).
	 * @param exemplaar het te verwijderen Exemplaar
	 */
	public void removeExemplaar(Exemplaar exemplaar) {
		exemplaren.remove(exemplaar);
	}
	
	/**
	 * Verkrijg de exemplaren als een lijst.
	 * @return List met exemplaren.
	 */
	public List<Exemplaar> getExemplaren() {
		return exemplaren;
	}
	
	/**
	 * Stel de ton waarin de voorraad van dit ProductType zit in.
	 * @param ton object
	 */
	public void setTon(Ton ton) {
		this.ton = ton;
		if(ton.getProductType() != this) {
			ton.setProductType(this);
		}
	}
	
	/**
	 * Verkrijg de ton waarin dit ProductType zich bevindt
	 * @return Ton
	 */
	public Ton getTon() {
		return this.ton;
	}
	
	/**
	 * Geeft een ProductType weergave voor een lijst. 
	 */
	public String toString() {
		return this.name + ", voorraad: " + getAantal();
	}
}